package com.net.user.service.impl;

import com.caikun.model.constant.RoleConstant;
import com.caikun.model.dto.UserLoginDTO;
import com.caikun.model.dto.UserRegisterDTO;
import com.caikun.model.entity.User;
import com.caikun.model.utils.EncryptUtils;
import com.net.user.mapper.UserMapper;
import com.net.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.List;

/**
 * 用户服务实现类
 */
@Slf4j
@Service
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserMapper userMapper;

    /**
     * 用户登录
     *
     * @param userLoginDTO
     * @return
     */
    @Override
    public User login(UserLoginDTO userLoginDTO) throws NoSuchAlgorithmException {
        // 1. 根据用户名查找用户
        User user = userMapper.selectByUsername(userLoginDTO.getUsername());
        if (user == null) {
            return null; // 用户不存在
        }
        // 2. 校验密码（假设明文比对，实际项目建议加密）
        String encryptedPassword = EncryptUtils.md5(userLoginDTO.getPassword() + user.getSalt());
        if (!user.getPassword().equals(encryptedPassword)) {
            log.info("密码错误{}", userLoginDTO);
            return null; // 密码错误
        }
        // 3. 登录成功，返回用户对象
        return user;
    }

    /**
     * 根据用户ID查询用户信息
     *
     * @param userId
     * @return
     */
    @Override
    public User getUserById(Long userId) {
        return userMapper.selectByUserId(userId);
    }

    /**
     * 根据用户名查询用户信息
     *
     * @param username
     * @return
     */
    @Override
    public User getUserByUsername(String username) {
        return userMapper.selectByUsername(username);
    }

    /**
     * 检查用户权限
     *
     * @param userId
     * @param needPermission
     * @return
     */
    @Override
    public boolean hasPermission(Long userId, Integer needPermission) {
        User user = getUserById(userId);
        if (user == null) {
            return false;
        }
        
        // 用户类型权限等级：0-顾客，1-维修人员，2-管理员
        Integer result = userMapper.selectUserPermissionByUserId(userId, needPermission);
        log.info("用户权限查询结果：{}", result);

        return result > 0 ? true : false;
    }

    /**
     * 获取用户菜单
     *
     * @param userId
     * @return
     */
    @Override
    public List<String> getUserMenus(Integer userId) {
        return userMapper.selectUserMenusByUserId(userId);
    }

    /**
     * 用户注册
     *
     * @param userRegisterDTO
     * @return
     */
    @Override
    public boolean register(UserRegisterDTO userRegisterDTO) throws Exception {
        // 1. 检查用户名是否存在
        User exist = userMapper.selectByUsername(userRegisterDTO.getUsername());
        if (exist != null) {
            return false;
        }
        // 2. 构造User对象
        User user = new User();
        user.setUsername(userRegisterDTO.getUsername());
        user.setRealName(userRegisterDTO.getRealName());
        user.setPhone(userRegisterDTO.getPhone());
        // 生成32位随机字符串作为盐值
        String salt = java.util.UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
        user.setSalt(salt);
        user.setSex(userRegisterDTO.getSex());
        // 密码加密
        String encryptedPwd = EncryptUtils.md5(userRegisterDTO.getPassword() + user.getSalt());
        user.setPassword(encryptedPwd);
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        user.setIsDelete(0);

        // 4. 插入数据库
        int rows = userMapper.insertUser(user);
        if (rows > 0) {
            log.info("用户注册成功，用户ID：{}", user.getUserId());
            
            // 新增用户后配置最基本的权限
            try {
                // 为新用户分配默认角色（假设角色ID为1代表普通用户）
                int roleRows = userMapper.insertUserRole(user.getUserId(), RoleConstant.ROLE_CUSTOMER);
                if (roleRows > 0) {
                    log.info("用户角色配置成功，用户ID：{}，角色ID：{}", user.getUserId(), 1);
                } else {
                    log.warn("用户角色配置失败，用户ID：{}", user.getUserId());
                }
            } catch (Exception e) {
                log.error("配置用户角色时发生异常，用户ID：{}", user.getUserId(), e);
                // 角色配置失败不影响用户注册成功
            }
            
            return true;
        }
        return false;
    }

    /**
     * 根据条件查询用户
     *
     * @param user 查询条件
     * @return
     */
    @Override
    public List<User> queryByCondition(User user) {
        return userMapper.queryByCondition(user);
    }

    /**
     * 更新用户信息
     *
     * @param user
     * @return
     */
    @Override
    public boolean updateUser(User user) {
        int rows = userMapper.updateUser(user);
        return rows > 0;
    }

    /**
     * 删除用户
     *
     * @param userId
     * @return
     */
    @Override
    public boolean deleteUser(Long userId) {
        int rows = userMapper.deleteById(userId);
        return rows > 0;
    }
} 